package tech.yixiyun.framework.kuafu.kits;

import cn.hutool.core.lang.Assert;

import java.util.Date;

/**
 * 断言工具类
 * @author Yixiyun
 * @version 1.0
 * @date 2021-06-15 15:11
 */
public class AssertKit {

    private static final String defaultTip = "参数无效";

    public static final String nullTip = "参数不允许有值";

    public static final String notNullTip = "参数不允许为null";

    public static final String notblankTip = "参数不允许为空字符串";

    public static final String dateValidTip = "参数中的日期范围无效";

    public static final String numberValidTip = "数值必须大于0";

    /**
     * 判断是否满足条件，不满足抛出AssertException
     * @param conditions
     * @param errorTipTemplate 提示的错误信息模板，可以使用{}占位符
     * @param templateParams 占位符传入的值
     */
    public static void state(boolean conditions, String errorTipTemplate, Object... templateParams) {
        if (conditions == false) {
            if (errorTipTemplate == null) {
                throw new AssertException(defaultTip);
            } else {
                throw new AssertException(StringKit.format(errorTipTemplate, templateParams));
            }
        }
    }


    /**
     * 断言是否非null，如果是null，会抛出AssertException
     * @param value
     * @param errorTipTemplate 提示的错误信息模板，可以使用{}占位符
     * @param templateParams 占位符传入的值
     */
    public static void notNull(Object value,String errorTipTemplate, Object... templateParams ) {
        if (errorTipTemplate == null) {
            errorTipTemplate = notNullTip;
        }
        state(value != null, errorTipTemplate, templateParams);
    }

    /**
     * 断言是否非null，如果是null，会抛出AssertException
     * @param value
     */
    public static void notNull(Object value) {
        notNull(value,null);
    }


    /**
     * 断言是否为null，如果不是null，会抛出AssertException
     * @param value
     * @param errorTipTemplate 提示的错误信息模板，可以使用{}占位符
     * @param templateParams 占位符传入的值
     */
    public static void isNull(Object value,String errorTipTemplate, Object... templateParams ) {
        if (errorTipTemplate == null) {
            errorTipTemplate = nullTip;
        }
        state(value == null, errorTipTemplate, templateParams);
    }

    /**
     * 断言是否为null，如果是null，会抛出AssertException
     * @param value
     */
    public static void isNull(Object value) {
        isNull(value, null);
    }

    /**
     * 断言是否非空字符串，如果是空字符串，会抛出AssertException
     * @param value
     * @param errorTipTemplate 提示的错误信息模板，可以使用{}占位符
     * @param templateParams 占位符传入的值
     */
    public static void notBlank(String value,String errorTipTemplate, Object... templateParams ) {
        if (errorTipTemplate == null) {
            errorTipTemplate = notblankTip;
        }
        state(StringKit.isNotBlank(value), errorTipTemplate, templateParams);
    }

    /**
     * 断言是否非空字符串，如果是空字符串，会抛出AssertException
     * @param value
     */
    public static void notBlank(String value) {
        notBlank(value, null);
    }


    /**
     * 断言两个日期是否有效，结束日期必须不早于开始日期，如果不符合，会抛出AssertException
     * @param startDate
     * @param endDate
     * @param errorTipTemplate 提示的错误信息模板，可以使用{}占位符
     * @param templateParams 占位符传入的值
     */
    public static void dateValid(Date startDate, Date endDate, String errorTipTemplate, Object... templateParams ) {
        if (errorTipTemplate == null) {
            errorTipTemplate = dateValidTip;
        }
        state(startDate != null && endDate != null && endDate.getTime() >= startDate.getTime(), errorTipTemplate, templateParams);
    }

    /**
     * 断言两个日期是否有效，结束日期必须不早于开始日期，如果不符合，会抛出AssertException
     * @param startDate
     * @param endDate
     */
    public static void dateValid(Date startDate, Date endDate) {
        dateValid(startDate, endDate,null);
    }

    /**
     * 断言数值是否有效，必须不为null且大于0，如果不符合，会抛出AssertException
     * @param value
     * @param errorTipTemplate 提示的错误信息模板，可以使用{}占位符
     * @param templateParams 占位符传入的值
     */
    public static void valid(Integer value,  String errorTipTemplate, Object... templateParams ) {
        if (errorTipTemplate == null) {
            errorTipTemplate = numberValidTip;
        }
        state(value != null && value > 0, errorTipTemplate, templateParams);
    }


    /**
     * 断言数值是否有效，必须不为null且大于0，如果不符合，会抛出AssertException
     * @param value
     */
    public static void valid(Integer value) {
        valid(value, null);
    }
    /**
     * 断言数值是否有效，必须不为null且大于0，如果不符合，会抛出AssertException
     * @param value
     * @param errorTipTemplate 提示的错误信息模板，可以使用{}占位符
     * @param templateParams 占位符传入的值
     */
    public static void valid(Long value,  String errorTipTemplate, Object... templateParams ) {
        if (errorTipTemplate == null) {
            errorTipTemplate = numberValidTip;
        }
        state(value != null && value > 0, errorTipTemplate, templateParams);
    }


    /**
     * 断言数值是否有效，必须不为null且大于0，如果不符合，会抛出AssertException
     * @param value
     */
    public static void valid(Long value) {
        valid(value, null);
    }
    /**
     * 断言数值是否有效，必须不为null且大于0，如果不符合，会抛出AssertException
     * @param value
     * @param errorTipTemplate 提示的错误信息模板，可以使用{}占位符
     * @param templateParams 占位符传入的值
     */
    public static void valid(Double value,  String errorTipTemplate, Object... templateParams ) {
        if (errorTipTemplate == null) {
            errorTipTemplate = numberValidTip;
        }
        state(value != null && value > 0, errorTipTemplate, templateParams);
    }


    /**
     * 断言数值是否有效，必须不为null且大于0，如果不符合，会抛出AssertException
     * @param value
     */
    public static void valid(Double value) {
        valid(value, null);
    }




    public static void main(String[] args) {
        String a = null;

        Assert.notNull(a);
//        notNull(a);
    }


}
